[도로 종합성능 PCA·군집분석 통합 프롬프트]

너는 통계분석, 다변량분석, 주성분분석(PCA), 군집분석 및 Python 데이터 분석을 수행하는 전문 데이터 분석가이자 도로공학 연구자이다.

첨부한 CSV 또는 Excel 데이터는 도로 구간별 교통·안전·환경·노면·경제성·내구성 관련 자료이다.

분석 목적은 다음과 같다.

1. 모든 성능변수의 방향을 “값이 높을수록 도로 성능이 우수함”으로 통일한다.
2. 변수들을 표준화한 후 주성분분석을 실시한다.
3. 주성분 점수를 이용해 적정 군집 수를 탐색하고 K-means 군집분석을 수행한다.
4. PCA Biplot과 군집분석 결과를 시각화한다.
5. PCA 결과를 이용해 도로 종합성능점수인 `PCA_Performance_Score`를 산출한다.
6. `PCA_Performance_Score`와 기존 `Overall_Performance_Index`의 산점도와 상관계수를 제시한다.
7. 기존 종합성능지수와 PCA 기반 성능점수의 일치성과 차이를 해석한다.

분석에 사용할 주요 변수는 다음과 같다.

* `Traffic_Capacity_vehph`
* `Avg_Speed_kmh`
* `Accident_Rate`
* `Noise_dB`
* `IRI_m_per_km`
* `Maintenance_Cost`
* `Service_Life_year`
* `Overall_Performance_Index`

분석은 반드시 다음 절차에 따라 수행하여라.

────────────────────────

1. 데이터 불러오기 및 기본 점검
   ────────────────────────

첨부된 CSV 또는 Excel 파일을 Python으로 직접 불러와라.

먼저 다음 내용을 확인하고 표로 제시하여라.

* 전체 행 수와 열 수
* 변수명
* 변수별 자료형
* 수치형 변수와 범주형 변수
* 결측치 개수와 비율
* 중복 행 개수
* 무한대 값 존재 여부
* 각 변수의 최솟값, 최댓값, 평균, 표준편차, 중앙값
* 극단적 이상치 존재 가능성
* 분석에 실제 사용되는 최종 표본 수 N

도로 구간 ID, 이름, 코드 등 식별변수가 있으면 PCA와 군집분석에서는 제외하되, 최종 결과표에는 다시 결합하여 각 도로 구간을 식별할 수 있도록 하여라.

데이터가 분석에 적합하지 않거나 변수명이 실제 데이터와 다르면 임의로 결과를 만들지 말고, 실제 변수명을 확인하여 가장 타당한 방식으로 수정한 뒤 그 내용을 설명하여라.

────────────────────────
2. 분석변수 선정
────────────────────────

PCA 및 군집분석에는 다음 7개 변수만 사용하여라.

* `Traffic_Capacity_vehph`
* `Avg_Speed_kmh`
* `Accident_Rate`
* `Noise_dB`
* `IRI_m_per_km`
* `Maintenance_Cost`
* `Service_Life_year`

`Overall_Performance_Index`는 기존 변수들로 산출된 종합지수이므로 PCA와 군집분석의 입력변수에서는 반드시 제외하여라.

다만 분석 마지막 단계에서는 `PCA_Performance_Score`와 비교·검증하기 위한 외부 준거변수로 사용하여라.

다음 조건도 확인하여라.

* `Maintenance_Cost`가 총비용인지, km당 비용인지 확인
* 총비용일 경우 도로 길이 또는 차로 수에 따른 규모효과가 발생할 수 있음을 설명
* `Service_Life_year`가 다른 분석변수로 산출된 파생변수인지 확인
* 파생변수라면 정보 중복 가능성을 설명
* `Avg_Speed_kmh`가 무조건 높을수록 좋은 지표인지 도로 유형과 제한속도를 고려하여 설명
* 관련 보정변수가 데이터에 없으면 현재 분석에서는 높을수록 긍정적인 변수로 처리하되 제한점을 명시

────────────────────────
3. 변수 방향 통일
────────────────────────

모든 변수를 “값이 높을수록 성능이 우수한 방향”으로 통일하여라.

긍정형 변수는 원래 방향을 유지한다.

* `Traffic_Capacity_vehph`
* `Avg_Speed_kmh`
* `Service_Life_year`

부정형 또는 패널티 변수는 값이 높을수록 성능이 좋지 않으므로 방향을 반전한다.

* `Accident_Rate`
* `Noise_dB`
* `IRI_m_per_km`
* `Maintenance_Cost`

패널티 변수는 표준화 후 Z점수에 −1을 곱하는 방법으로 방향을 전환하여라.

예:

* `Accident_Performance = -Z(Accident_Rate)`
* `Noise_Performance = -Z(Noise_dB)`
* `Ride_Quality_Performance = -Z(IRI_m_per_km)`
* `Maintenance_Efficiency = -Z(Maintenance_Cost)`

긍정형 변수는 다음처럼 표준화 값을 그대로 사용하여라.

* `Capacity_Performance = Z(Traffic_Capacity_vehph)`
* `Speed_Performance = Z(Avg_Speed_kmh)`
* `Service_Life_Performance = Z(Service_Life_year)`

변수 방향을 반전하는 이유와, 부호 반전이 PCA의 설명분산 자체를 바꾸기보다는 성능점수의 해석 방향을 통일하기 위한 조치라는 점을 설명하여라.

────────────────────────
4. 표준화
────────────────────────

각 변수는 단위와 범위가 다르므로 `StandardScaler`를 이용해 평균 0, 표준편차 1로 표준화하여라.

표준화 전후의 기술통계를 비교하여 제시하여라.

표준화한 데이터에서 다음을 확인하여라.

* 각 변수의 평균이 약 0인지
* 각 변수의 표준편차가 약 1인지
* 결측치나 무한대 값이 발생하지 않았는지

패널티 변수는 표준화 후 부호를 반전하여 모든 변수의 방향을 높을수록 긍정적으로 통일하여라.

────────────────────────
5. PCA 적용 가능성 점검
────────────────────────

PCA 수행 전에 다음을 확인하여라.

1. Pearson 상관계수 행렬
2. 상관계수 히트맵
3. KMO 표본적합도
4. Bartlett 구형성 검정
5. 변수별 MSA
6. 변수 수 대비 표본 수
7. 상관성이 지나치게 낮거나 높은 변수 존재 여부

KMO와 Bartlett 검정을 실행하는 데 필요한 패키지가 설치되어 있지 않으면 설치 코드를 포함하거나, 동일한 검정을 직접 계산하는 함수를 작성하여 실제로 실행하여라.

판단 기준을 설명하여라.

* KMO 0.50 미만: PCA 적합성 낮음
* KMO 0.50 이상: 최소한의 적용 가능성
* KMO 0.60 이상: 보통 이상
* Bartlett 검정 p값 < 0.05: 변수 간 상관구조가 PCA에 적합

KMO 또는 Bartlett 결과가 좋지 않더라도 결과를 숨기지 말고, 탐색적 분석의 한계를 명확히 설명하여라.

────────────────────────
6. 주성분분석 실행
────────────────────────

방향을 통일한 표준화 변수 7개를 이용해 PCA를 수행하여라.

다음 결과를 제시하여라.

* 각 주성분의 고유값
* 각 주성분의 설명분산비율
* 누적 설명분산비율
* Scree Plot
* 누적 설명분산 그래프
* Kaiser 기준에 따른 고유값 1 이상 주성분 수
* 누적 설명분산 70%, 80%, 90%를 충족하는 최소 주성분 수

최종 PCA 차원 수는 다음 기준을 종합적으로 고려하여 결정하여라.

* 고유값 1 이상
* Scree Plot의 elbow 지점
* 누적 설명분산비율
* 주성분 해석 가능성
* 이후 군집분석에 충분한 정보가 보존되는지

선택한 주성분 수와 그 근거를 명확히 설명하여라.

────────────────────────
7. 주성분 적재량과 해석
────────────────────────

각 변수의 주성분 적재량을 표로 제시하여라.

적재량은 필요하면 다음 방식 중 하나를 사용하되 어떤 정의를 사용했는지 명시하여라.

* PCA eigenvector
* eigenvector × √eigenvalue로 계산한 correlation loading

PC1, PC2 및 최종 선택한 주요 주성분별로 절댓값이 큰 적재량을 중심으로 해석하여라.

예를 들어 다음과 같은 잠재적 의미를 검토하되, 실제 결과를 확인하지 않고 미리 단정하지 마라.

* 이동성 및 교통처리 성능
* 안전·환경 성능
* 노면 및 유지관리 성능
* 경제성 및 내구성
* 종합 도로서비스 성능

주성분의 부호는 수학적으로 임의적일 수 있으므로, 최종적으로 PC1 또는 종합점수가 높을수록 도로 성능이 우수하도록 필요하면 전체 주성분 점수의 부호를 조정하여라.

부호를 조정한 경우 조정 전후의 관계와 조정 근거를 설명하여라.

────────────────────────
8. Biplot 작성
────────────────────────

PC1과 PC2를 이용한 PCA Biplot을 작성하여라.

Biplot에는 다음을 포함하여라.

* 각 도로 구간의 PC1 및 PC2 점수
* 변수별 loading vector
* 변수명 라벨
* 원점을 통과하는 기준선
* PC1과 PC2의 설명분산비율을 축 제목에 표시
* 도로 구간 ID가 있으면 점 라벨 또는 별도 범례로 표시
* 점이 지나치게 많으면 라벨 중첩을 줄이기 위한 조치
* 최적 군집 결과에 따른 군집별 구분

점수 좌표와 적재량 벡터의 크기 차이 때문에 화살표가 보이지 않거나 지나치게 커지지 않도록 시각화 배율을 합리적으로 조정하여라.

Biplot에서 각 변수 방향, 변수 간 각도, 도로 구간의 위치가 의미하는 내용을 해석하여라.

────────────────────────
9. 최적 군집 수 탐색
────────────────────────

PCA에서 최종 선택한 주성분 점수를 이용하여 K-means 군집분석을 수행하여라.

원래 7개 변수를 다시 사용하지 말고, 선택한 PCA 점수를 군집분석 입력값으로 사용하여라.

최적 군집 수는 최소 2개부터 다음 범위에서 탐색하여라.

* 기본 범위: k = 2~10
* 표본 수가 적으면 가능한 최대 k를 표본 수에 맞게 자동 조정
* 각 군집에 지나치게 적은 표본이 배정되지 않도록 확인

각 k에 대해 다음 지표를 계산하여라.

1. Inertia 또는 WCSS
2. Silhouette Score
3. Calinski–Harabasz Index
4. Davies–Bouldin Index

다음 그래프를 작성하여라.

* Elbow Plot
* Silhouette Score Plot
* Calinski–Harabasz Index Plot
* Davies–Bouldin Index Plot

최적 군집 수는 단일 지표만으로 결정하지 말고 다음을 종합적으로 고려하여라.

* WCSS elbow 지점
* Silhouette Score가 높은 k
* Calinski–Harabasz Index가 높은 k
* Davies–Bouldin Index가 낮은 k
* 군집별 표본 수의 균형
* 군집의 도로공학적 해석 가능성

최종 선택한 최적 군집 수를 `optimal_k`로 저장하고 선정 근거를 설명하여라.

K-means는 다음 조건으로 실행하여라.

* `random_state=42`
* `n_init`을 명시적으로 설정
* 동일한 seed를 사용해 재현성 확보

────────────────────────
10. 최적 군집분석 결과
────────────────────────

최적 군집 수를 이용하여 각 도로 구간에 군집번호를 부여하여라.

다음 결과를 제시하여라.

* 군집별 표본 수
* 군집별 PCA 점수 평균
* 군집별 원변수 평균
* 군집별 방향 통일 성능변수 평균
* 군집별 `PCA_Performance_Score` 평균
* 군집별 `Overall_Performance_Index` 평균
* 군집 간 주요 특성 차이

군집번호 0, 1, 2 등은 성능순위를 의미하지 않으므로, 군집별 평균 `PCA_Performance_Score`를 기준으로 성능 수준을 재정렬하고 다음처럼 해석 가능한 군집명을 추가하여라.

예:

* 우수 성능군
* 중상 성능군
* 보통 성능군
* 취약 성능군

단, 실제 군집 수와 결과에 맞게 군집명을 결정하고, 사전에 임의로 정하지 마라.

PC1과 PC2 산점도에 최적 군집 결과를 표시하고 다음을 포함하여라.

* 군집별 점
* 군집 중심점
* PC1 및 PC2 설명분산비율
* 필요하면 각 도로 구간 ID
* 군집별 범례

────────────────────────
11. PCA 기반 종합성능점수 산출
────────────────────────

군집번호 자체는 연속형 성능점수가 아니므로 `Overall_Performance_Index`와 직접 Pearson 상관분석하지 마라.

대신 선택된 주성분 점수와 설명분산비율을 이용하여 연속형 종합성능점수인 `PCA_Performance_Score`를 산출하여라.

기본 계산식은 다음과 같다.

PCA_Performance_Score
= Σ(선택된 각 주성분 점수 × 해당 주성분의 설명분산비율)
÷ 선택된 주성분 설명분산비율의 합

즉, 선택된 주성분들의 설명분산비율을 정규화한 가중치로 사용하여라.

예:

* PC1 가중치 = PC1 설명분산비율 ÷ 선택된 PC들의 설명분산비율 합
* PC2 가중치 = PC2 설명분산비율 ÷ 선택된 PC들의 설명분산비율 합
* 나머지 선택된 PC도 동일하게 계산

최종 점수가 높을수록 도로 성능이 우수하도록 점수 방향을 확인하여라.

필요한 경우 다음 기준을 이용해 전체 점수의 부호를 반전하여라.

* `Traffic_Capacity_vehph`, `Avg_Speed_kmh`, `Service_Life_year`와는 대체로 양의 관계
* 방향을 반전한 사고·소음·IRI·유지관리 성능변수와도 대체로 양의 관계
* 기존 `Overall_Performance_Index`가 높을수록 좋은 지수라면 그 지수와 양의 관계가 되도록 확인

단, 기존 `Overall_Performance_Index`와의 상관을 인위적으로 높이기 위해 데이터별로 점수식을 변경하지 마라. 부호 방향만 해석 가능하도록 조정하여라.

추가로 `PCA_Performance_Score`를 0~100점으로 변환한 다음 변수도 생성하여라.

`PCA_Performance_Score_100`

Min-Max 변환을 사용하여라.

PCA_Performance_Score_100
= 100 × (Score − 최소값) ÷ (최댓값 − 최소값)

원래 PCA 점수와 0~100점 환산 점수를 모두 결과표에 포함하여라.

────────────────────────
12. PCA 점수와 기존 종합지수 비교
────────────────────────

`PCA_Performance_Score`와 `Overall_Performance_Index` 간 관계를 분석하여라.

먼저 두 변수의 결측치와 분포를 확인하여라.

다음 상관분석을 수행하여라.

1. Pearson 상관계수
2. Pearson 상관검정 p값
3. Spearman 순위상관계수
4. Spearman 상관검정 p값
5. 가능하면 95% 신뢰구간

Pearson 상관분석 전에 다음을 점검하여라.

* 두 변수의 선형관계
* 이상치
* 분포 형태
* 산점도
* 필요하면 Shapiro–Wilk 정규성 검정

표본 수가 작거나 이상치·비정규성이 뚜렷하면 Spearman 상관계수를 함께 중점적으로 해석하여라.

상관계수의 크기와 방향을 해석하되, 상관관계가 인과관계를 의미하지 않는다는 점을 명시하여라.

────────────────────────
13. Scatter Plot 작성
────────────────────────

x축에는 `Overall_Performance_Index`, y축에는 `PCA_Performance_Score`를 배치한 산점도를 작성하여라.

산점도에는 다음을 포함하여라.

* 각 도로 구간의 관측값
* 최적 군집에 따른 점 구분
* 선형회귀 추세선
* 95% 신뢰구간
* Pearson 상관계수 r
* Pearson p값
* Spearman 상관계수 ρ
* 표본 수 N
* 축 제목
* 그래프 제목
* 군집별 범례

가능하면 도로 구간 ID를 점 근처에 표시하되, 표본 수가 많아 가독성이 낮아지면 주요 이상치 또는 대표 지점에만 표시하여라.

추가로 `PCA_Performance_Score_100`과 `Overall_Performance_Index`의 척도가 모두 0~100이라면 두 점수의 일치성을 확인하기 위해 다음 그래프도 선택적으로 제시하여라.

* y=x 기준선이 포함된 산점도
* 두 점수 차이 분포
* Bland–Altman Plot

단, 두 지수가 동일한 개념과 동일한 척도를 측정한다고 판단되는 경우에만 Bland–Altman 분석을 수행하고 그 적용 이유를 설명하여라.

────────────────────────
14. 결과표 작성
────────────────────────

최종 결과표에는 가능한 경우 다음 변수를 포함하여라.

* 도로 구간 ID
* 원래 7개 성능변수
* `Overall_Performance_Index`
* 방향을 통일한 표준화 변수
* 선택된 각 주성분 점수
* `PCA_Performance_Score`
* `PCA_Performance_Score_100`
* 원래 K-means 군집번호
* 성능순으로 재정렬한 군집번호
* 해석 가능한 군집명

결과표는 화면에 일부만 표시하지 말고 전체 행을 저장한 파일도 생성하여라.

저장 파일 예:

* `PCA_Clustering_Final_Results.csv`
* `PCA_Clustering_Final_Results.xlsx`

그래프도 각각 파일로 저장하여라.

예:

* `correlation_heatmap.png`
* `pca_scree_plot.png`
* `pca_biplot.png`
* `cluster_validation.png`
* `pca_cluster_plot.png`
* `score_vs_overall_scatter.png`

────────────────────────
15. 결과 해석
────────────────────────

실제 Python 실행 결과를 바탕으로 다음 내용을 설명하여라.

1. 데이터의 기본 특성
2. 변수 방향 통일 결과
3. PCA 적용 적합성
4. 선택된 주성분 수와 근거
5. 각 주성분의 의미
6. 주요 변수의 적재량
7. 최적 군집 수와 선정 근거
8. 각 군집의 도로공학적 특성
9. 우수군과 취약군의 차이
10. `PCA_Performance_Score`의 산출 결과
11. 기존 `Overall_Performance_Index`와의 상관관계
12. 두 지수의 일치 여부
13. 상관이 낮거나 음수일 경우 가능한 원인
14. 유지관리 우선순위 및 도로관리 활용방안
15. 표본 수, 변수 구성 및 방법론적 한계

상관이 높으면 기존 종합성능지수가 다변량 구조를 비교적 잘 반영한다고 해석할 수 있다.

상관이 낮으면 다음 가능성을 검토하여라.

* 기존 지수의 변수 가중치와 PCA 가중치 차이
* 비선형 관계
* 일부 변수의 과도한 영향
* 이상치
* 도로 유형별 구조 차이
* 유지관리비의 규모효과
* 속도와 교통용량의 도로유형 의존성
* 기존 종합지수에 포함된 추가 변수
* PCA가 분산을 최대화하는 방법이지 성능평가 목적함수를 직접 최적화하는 방법은 아니라는 점

────────────────────────
16. Python 코드 작성 및 실제 실행
────────────────────────

분석을 설명만 하지 말고 반드시 전체 Python 코드를 작성한 후 실제 Python 실행 환경에서 실행하여라.

코드는 처음부터 끝까지 한 번에 실행할 수 있도록 작성하여라.

사용 가능한 주요 라이브러리 예시는 다음과 같다.

* pandas
* numpy
* matplotlib
* scipy
* scikit-learn
* statsmodels
* openpyxl
* factor_analyzer

코드에는 다음이 포함되어야 한다.

* CSV와 Excel 파일 자동 인식
* 파일명 또는 업로드 파일 자동 탐색
* 변수명 앞뒤 공백 제거
* 숫자형 변환
* 결측치 및 무한대 처리
* 데이터 검증
* 변수 방향 통일
* StandardScaler
* KMO 및 Bartlett 검정
* PCA
* Scree Plot
* 적재량 표
* Biplot
* 최적 군집 수 탐색
* K-means
* 군집평가 지표
* 군집별 프로파일
* PCA 기반 가중 종합점수
* 0~100점 변환
* Pearson 및 Spearman 상관분석
* 회귀 추세선 산점도
* 결과표 저장
* 그래프 저장
* 오류 처리
* 재현성을 위한 random seed 설정

코드의 주요 단계마다 한국어 주석을 작성하여라.

실행 중 오류가 발생하면 오류 메시지만 제시하지 말고, 원인을 확인하고 코드를 수정한 후 다시 실행하여 최종적으로 실행 가능한 결과를 제시하여라.

가상의 결과, 예상 수치, 임의의 상관계수, 임의의 최적 군집 수를 작성하지 마라.

반드시 첨부 데이터로 실제 실행한 결과만 제시하여라.

────────────────────────
17. 최종 출력 순서
────────────────────────

최종 답변은 다음 순서로 작성하여라.

① 분석 목적과 변수 구성
② 제외변수와 패널티 변수 처리
③ 데이터 점검 결과
④ 표준화 및 방향 통일 결과
⑤ PCA 적합성 검정
⑥ 주성분 수 결정
⑦ 설명분산과 적재량
⑧ Biplot
⑨ 최적 군집 수 결정
⑩ 최종 군집분석 결과
⑪ PCA 기반 종합성능점수
⑫ `Overall_Performance_Index`와의 Scatter Plot
⑬ Pearson 및 Spearman 상관계수와 p값
⑭ 도로공학적 해석
⑮ 분석의 한계와 활용방안
⑯ 전체 Python 코드
⑰ 실제 Python 실행 결과
⑱ 다운로드 가능한 결과 CSV·Excel·PNG 파일

통계값은 가능한 경우 다음 형식으로 제시하여라.

* 표본 수 N
* 통계량
* 자유도
* 정확한 p값
* 반올림한 p값
* 설명분산비율
* 누적 설명분산비율
* 상관계수
* 95% 신뢰구간

p값이 매우 작은 경우 단순히 `p=0.000`으로 쓰지 말고 `p<0.001` 또는 실제 계산값을 함께 제시하여라.

최종 해석은 Python에서 실제 산출된 수치와 그래프만을 근거로 작성하여라.
